package com.chinaedu.oc.controller.product;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.chinaedu.oc.constant.Constant;
import com.chinaedu.oc.po.dto.PubOutputDto;
import com.chinaedu.oc.po.product.ProductArea;
import com.chinaedu.oc.po.product.dto.AddProductInput;
import com.chinaedu.oc.po.product.dto.ProductInput;
import com.chinaedu.oc.po.product.dto.QueryProductInput;
import com.chinaedu.oc.po.product.dto.QueryProductOutput;
import com.chinaedu.oc.po.productline.ProductLine;
import com.chinaedu.oc.po.productline.ProductLineKey;
import com.chinaedu.oc.sdk.bo.Product;
import com.chinaedu.oc.sdk.bo.ProductDesc;
import com.chinaedu.oc.sdk.bo.ProductUpload;
import com.chinaedu.oc.sdk.result.Result;
import com.chinaedu.oc.sdk.util.CheckSign;
import com.chinaedu.oc.serv.product.IProduct;
import com.chinaedu.oc.serv.product.IProductLine;
import com.chinaedu.oc.uri.IName;
import com.chinaedu.oc.util.common.CheckParamException;
import com.chinaedu.oc.util.common.JsonUtil;
import com.chinaedu.oc.util.common.StringUtil;

/**
 * 产品
 * @Description: TODO
 * @author A18ccms a18ccms_gmail_com 
 * @date 2017年5月11日 上午10:12:09 
 *
 */
@Controller
public class ProductController {
	
	@Autowired
	IProduct iProduct;
	@Autowired
	IProductLine iProductLine;
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	/**
	 * 推送产品元素
	 * @Description: TODO
	 * @param     
	 * @return void    返回类型 
	 * @throws
	 */
	@ResponseBody
	@RequestMapping(IName.Product.ADD_UPDATE_PRODUCT)
	public Result addProduct(String data, String sign, String currentMill) {
		
		Result r = new Result();
		
		ProductUpload pu = JsonUtil.toBean(data, ProductUpload.class);
		
		logger.debug("推送产品上来:{}", JsonUtil.toJson(pu).toJSONString());
		
		//查询产品线编码
		if(StringUtil.isBlack(pu.getProduct().getProductLineCode())) {
			r.setResult(Integer.parseInt(Constant.NO_2));
			r.setMsg("产品线编码为空");
			return r;
		}
		
		//检查秘钥
		ProductLineKey plk = iProductLine.queryKeyByProductLineCode(pu.getProduct().getProductLineCode());
		if(plk == null || StringUtil.isBlack(plk.getSecretKey())) {
			r.setMsg("产品线秘钥不匹配");
			r.setResult(Integer.parseInt(Constant.NO_2));
			
			return r;
		}
		
		//检查产品线
		ProductLine pl = iProductLine.queryByCode(pu.getProduct().getProductLineCode());
		if (pl == null) {
			r.setResult(Integer.parseInt(Constant.NO_2));
			r.setMsg("产品线不存在");

			return r;
		}
		if ((Constant.STOP_USE_2 + "").equals(pl.getStartUse())) {
			r.setResult(Integer.parseInt(Constant.NO_2));
			r.setMsg("产品线已停用");

			return r;
		}
		
		//检查签名
		CheckSign c = new CheckSign();
		Result check = c.Check(sign, plk.getSecretKey(), Long.parseLong(currentMill), pu.getProduct());
		
		if(check.getResult() == Integer.parseInt(Constant.NO_2)) {
			return check;
		}
		
		//添加数据
		AddProductInput addProduct = new AddProductInput();
		com.chinaedu.oc.po.product.Product ap = new com.chinaedu.oc.po.product.Product();
		
		//解析product
		Product uploadProcut = pu.getProduct();
		ap = this.getFromUpdateProduct(uploadProcut);
		
		//解析area
		List<ProductArea> listA = this.getAreaFromString(pu.getListArea());
		
		//解析desc
		List<com.chinaedu.oc.po.product.ProductDesc> listD = this.getDescFromUpload(pu.getListProductDesc());
		
		addProduct.setListProductArea(listA);
		addProduct.setProduct(ap);
		addProduct.setListProductDesc(listD);
		
		//设置产品线id
		addProduct.getProduct().setProductLine(pl.getId());
		try {
			PubOutputDto out = iProduct.addProduct(addProduct);
			r.setResult(out.getStatus() ? 1 : 2);
			r.setMsg(out.getMsg());
			
			return r;
		} catch (CheckParamException e) {
			r.setResult(Integer.parseInt(Constant.NO_2));
			r.setMsg(e.getErrorMsg());
			
			return r;
		}
	}
	
	/**
	 * 查询产品元素
	 * @Description: TODO
	 * @param @param data
	 * @param @return    
	 * @return QueryProductOutput    返回类型 
	 * @throws
	 */
	@ResponseBody
	@RequestMapping(IName.Product.QUERY_PRODUCT)
	public QueryProductOutput queryProdcut(String data) {
		QueryProductInput input = JsonUtil.toBean(data, QueryProductInput.class);
		QueryProductOutput out = iProduct.queryProduct(input);
		
		return out;
	}
	/**
	 * 审核
	 * @Description: TODO
	 * @param @param data
	 * @param @return    
	 * @return PubOutputDto    返回类型 
	 * @throws
	 */
	@ResponseBody
	@RequestMapping(IName.Product.REVIEW_PRODUCT)
	public PubOutputDto reviewProduct(String data) {
		ProductInput input = JsonUtil.toBean(data, ProductInput.class);
		PubOutputDto out = iProduct.reviewProduct(input);
		
		return out;
	}
	/**
	 * 生成商品
	 * @Description: TODO
	 * @param @param data
	 * @param @return    
	 * @return PubOutputDto    返回类型 
	 * @throws
	 */
	@RequestMapping(IName.Product.TO_COMMODITY_PRODUCT)
	@ResponseBody
	public PubOutputDto toCommodity(String data) {
		ProductInput input = JsonUtil.toBean(data, ProductInput.class);
		PubOutputDto out = iProduct.toCommodity(input);
		
		return out;
	}
	
	/*
	 * sdk的Product---->product
	 */
	private com.chinaedu.oc.po.product.Product getFromUpdateProduct(Product uploadProcut){
		if(uploadProcut == null) {
			return new com.chinaedu.oc.po.product.Product();
		}
		com.chinaedu.oc.po.product.Product bean = JsonUtil.toBean(JsonUtil.toJson(uploadProcut), com.chinaedu.oc.po.product.Product.class);
		bean.setProductLine(uploadProcut.getProductLineCode());
		return bean;
	}
	/*
	 * sdk的area----->productArea
	 */
	private List<ProductArea> getAreaFromString(List<String> list){
		List<ProductArea> listA = new ArrayList<ProductArea>();
		if(list == null) {
			return listA;
		}
		for(String s : list) {
			ProductArea pa = new ProductArea();
			pa.setAreaId(s);
			listA.add(pa);
		}
		
		return listA;
	}
	/*
	 * sdk的desc---->productDesc
	 */
	private List<com.chinaedu.oc.po.product.ProductDesc> getDescFromUpload(List<ProductDesc> list){
		List<com.chinaedu.oc.po.product.ProductDesc> listD = new ArrayList<com.chinaedu.oc.po.product.ProductDesc>();
		if(list == null) {
			return listD;
		}
		for(ProductDesc p : list) {
			listD.add(JsonUtil.toBean(JsonUtil.toJson(p), com.chinaedu.oc.po.product.ProductDesc.class));
		}
		
		return listD;
	}
	
}
